/**
 * harmony.ConstantesHarmony.java
 * @author xavier.miorcec@elomobile.com
 * @18 déc. 2008
 * @ELO_dev_bernardi_200812
 */
package com.elomobile.harmony.utils;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.w3c.dom.Node;

import com.elomobile.harmony.xml.UniteBernardiType;
import com.elomobile.harmony.xml.UniteCapaciteDoc;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ListesType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ProtocoleType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.QuestionsType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.VoyageV3Doc;
import com.elomobile.utilitaire.sgbd2.ResultElo;
import com.elomobile.utilitaire.sgbd2.Sgbdr;

public class ConstantesHarmony {

	Logger log;
	private String cheminRecup;
	private String cheminDepart;

	private static ConstantesHarmony constantesHar = null;
	private ListesType liste;
	private QuestionsType listeQuestion;
	private HashMap<String, String> listeUnitesHarmony = null;
	private static int noSource;
	private static String nomSource;

	/**
	 * Appel de l'instance singleton
	 * @return l'instance unique de la classe
	 */
	public static ConstantesHarmony getInstance() {
		if (constantesHar == null) {
			getProperties();
			constantesHar = new ConstantesHarmony(noSource);
		}
		return constantesHar;
	}

	public ConstantesHarmony(int noSource) {
		initialisationListeQuestion();
		initialisationListeUnite();
		initialisationConstantes(noSource);
	}

	protected void initialisationConstantes(int noSource) {
		ResultElo rs = Sgbdr.bdd(this.log).parametre().getDetailsOptionBernardi(10, noSource);
		if (rs.nextDuResultSet()) {
			this.cheminDepart = rs.getString("cheminDepart");
			this.cheminRecup = rs.getString("cheminRecup");
		}
	}

	/**
	 * Initialisation des questions bernardi en fonction d'un fichier de configuration
	 */
	protected void initialisationListeQuestion() {
		try {
			VoyageV3Doc doc = new VoyageV3Doc();
			Node noeud = null;
			noeud = doc.load("conf/questionBernardi.xml");
			doc.setEncoding("ISO-8859-1");
			ProtocoleType protocoleType = new ProtocoleType(noeud);
			this.liste = protocoleType.getVoyage().getListes();
			this.listeQuestion = protocoleType.getVoyage().getQuestions();
		} catch (Exception e) {
			log.fatal(e);
		}
	}

	/**
	 * Initialisation des unité bernardi en fonction d'un fichier de configuration
	 */
	protected void initialisationListeUnite() {
		try {
			UniteCapaciteDoc doc = new UniteCapaciteDoc();
			// TODO BERNARDI properties à gere pour le chemin du fichier
			Node noeud = null;
			noeud = doc.load("conf/uniteBernardi.xml");
			doc.setEncoding("ISO-8859-1");
			this.listeUnitesHarmony = new HashMap<String, String>();
			UniteBernardiType unite = new UniteBernardiType(noeud);
			for (int i = 0; i < unite.getUniteCount(); i++) {
				this.listeUnitesHarmony.put(unite.getUniteAt(i).getCodeUnite().getValue(), unite.getUniteAt(i).getLibelleUnite().getValue());
			}
		} catch (Exception e) {
			log.fatal(e);
		}
	}

	protected static void getProperties() {
		File file = new File("conf/application.properties");
		Properties prop = new Properties();
		try {
			prop.load(new FileInputStream(file));
			noSource = Integer.parseInt((String) prop.get("service.noSource"));
			ResultElo rs = Sgbdr.bdd().executerRequete("SELECT libelleSource from source where noSource = " + noSource);
			rs.nextDuResultSet();
			nomSource = rs.getString("libelleSource");
		} catch (FileNotFoundException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @return the liste
	 */
	public ListesType getListe() {
		return liste;
	}

	/**
	 * @return the listeQuestion
	 */
	public QuestionsType getListeQuestion() {
		return listeQuestion;
	}

	/**
	 * @return the listeUnitesHarmony
	 */
	public HashMap<String, String> getListeUnitesHarmony() {
		return listeUnitesHarmony;
	}

	/**
	 * @param listeUnitesHarmony the listeUnitesHarmony to set
	 */
	public void setListeUnitesHarmony(HashMap<String, String> listeUnitesHarmony) {
		this.listeUnitesHarmony = listeUnitesHarmony;
	}

	/**
	 * Renvoie le libellé d'une unité en fonction de son code
	 * @param code le code du planning
	 * @return le libellé associé
	 */
	public String getUnite(String code) {
		if (this.listeUnitesHarmony != null && this.listeUnitesHarmony.containsKey(code)) {
			return this.listeUnitesHarmony.get(code);
		} else {
			return code;
		}
	}

	/**
	 * @return the log
	 */
	public Logger getLog() {
		return log;
	}

	/**
	 * @param log the log to set
	 */
	public void setLog(Logger log) {
		this.log = log;
	}

	/**
	 * @return the cheminRecup
	 */
	public String getCheminRecup() {
		return cheminRecup;
	}

	/**
	 * @param cheminRecup the cheminRecup to set
	 */
	public void setCheminRecup(String cheminRecup) {
		this.cheminRecup = cheminRecup;
	}

	/**
	 * @return the cheminDepart
	 */
	public String getCheminDepart() {
		return cheminDepart;
	}

	/**
	 * @param cheminDepart the cheminDepart to set
	 */
	public void setCheminDepart(String cheminDepart) {
		this.cheminDepart = cheminDepart;
	}

	/**
	 * @return the nomSource
	 */
	public static String getNomSource() {
		return nomSource;
	}

	/**
	 * @param nomSource the nomSource to set
	 */
	public static void setNomSource(String nomSource) {
		ConstantesHarmony.nomSource = nomSource;
	}
}
